<?php

namespace Framework;

use PDO;

class Database {
    public $conn;

    /**
     * Database 类构造器
     *
     * @param array $config 数据库配置数组
     */
    public function __construct($config) {
        // DSN 字符串，添加了 charset 选项来指定字符集
        $dsn = "mysql:host={$config['host']};port={$config['port']};dbname={$config['dbname']};charset=utf8mb4";
        // 设置 PDO 选项
        $options = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
            PDO::ATTR_EMULATE_PREPARES => false, // 确保使用真正的预处理语句
        ];

        try {
            // 创建 PDO 实例
            $this->conn = new PDO($dsn, $config['username'], $config['password'], $options);
        } catch (\PDOException $e) {
            throw new \Exception("数据库连接失败：{$e->getMessage()}");
        }
    }

    /**
     * 执行数据库查询
     *
     * @param string $query SQL查询语句
     * @param array $params 参数绑定数组
     * @return PDOStatement
     * @throws \PDOException
     */
    public function query($query, $params = []) {
        try {
            $sth = $this->conn->prepare($query);
            // 对于命名参数，使用参数名而不是数字索引
            foreach ($params as $param => $value) {
                // 确保参数名与 SQL 语句中的占位符匹配
                $sth->bindValue(':' . $param, $value);
            }

            $sth->execute();
            return $sth;
        } catch (\PDOException $e) {
            throw new \Exception("数据库请求执行失败: {$e->getMessage()}" );
        }
    }
}